package com.situ.onlinebookstore.back.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 作为各层方法运行时间的通知
 */
@Aspect   //切面
@Component
public class RuntimeAdvise {

    //定义切点
    @Pointcut("execution(* com.situ.onlinebookstore.back.service..*(..))")
    public void pointCut(){}

    //前置通知
    @Before("pointCut()")
    public void doBefore(){
        System.out.println("这是一个前置通知");
    }

    //后置通知 无论方法如何结束都会执行
    @After("pointCut()")
    public void doAfter(){
        System.out.println("这是一个后置通知");
    }

    @AfterReturning("pointCut()")
    public void afterReturn(){
        System.out.println("这是一个正常执行的后置通知");
    }

    @AfterThrowing("pointCut()")
    public void afterThrow(){
        System.out.println("这是一个异常执行的后置通知");
    }

    //环绕通知
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        //有一部分在方法执行前
        Date start = new Date();
        //调用方法
        Object obj = pjp.proceed(pjp.getArgs());
        //有一部分在方法执行后
        Date end = new Date();
        System.out.println(pjp.getTarget());
        System.out.println(pjp.toShortString());
        System.out.println("执行时间是："+(end.getTime()-start.getTime())+"ms");
        return obj;
    }
}
